export default function nestTokens(tokens) {
  // 结果数组
  const nestedTokens = [];
  // 收集器
  let collector = nestedTokens;
  // 栈数组
  const sections = [];
  // 遍历tokens数组
  for (let i = 0; i < tokens.length; i++) {
    const token = tokens[i];
    switch (token[0]) {
      case '#':
        // 此时收集器和结果数组指向的是同一个数组
        // 收集器中添加token时，相当于结果数组也添加token
        collector.push(token);
        sections.push(token);
        // token数组的第三项添加一个新的数组用来收集剩下的遍历项
        // 收集器和结果数组和sections中的token指向同一个数组
        // 此时token发生变化的时候，所有的token都会添加新的数组
        token[2] = [];
        // 将新的数组赋值给收集器
        // 此时sections中的token[2]和结果数组中的token[2]和collector指向的是同一个数组
        collector = token[2];
        break;
      case '/':
        // 删除栈数组中的token，根据栈数组中有无数组，来指定collections的值
        sections.pop();
        collector = sections.length > 0 ? sections[sections.length - 1][2] : nestedTokens;
        break;
      default:
        // 所以收集器发生变化时sections和结果数组中token[2]也会发生变化
        // 遍历到的新的项都会push到token[2]中
        collector.push(token);
        break;
    }
  }
  return nestedTokens;
}
